﻿using System;
using System.Web;
using Microsoft.AspNet.SignalR;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using DataCenter;

namespace MvcApplicationSignalR.Hubs
{
    /// <summary>
    /// Lớp cơ sở của server hub, kế thừa từ signalR hub
    /// </summary>
    public class HubBase : Hub
    {
        /// <summary>
        /// Delegate của hàm 
        /// </summary>
        /// <param name="printerName"></param>
        /// <param name="message"></param>
        public delegate void ConnectSuccess();

        /// <summary>
        /// Danh sách các client kết nối vào server
        /// </summary>
        public static ClientList _ClientList = new ClientList();

        /// <summary>
        /// Hàm được window app client gọi khi bắt đầu kết nối
        /// </summary>
        /// <param name="winClientName">Tên của client</param>
        /// <param name="hubConnectionID">ID của connection</param>
        public void WinNotify(string winClientName)
        {
            //_ClientList = _ClientList ?? new ClientList();
            _ClientList.Add(new Client
            {
                ClientName = winClientName,
                ConnectionID = Context.ConnectionId,
                LastConnected = DateTime.Now
            });
            
        }

        /// <summary>
        /// Hàm được web client gọi khi bắt đầu kết nối
        /// </summary>
        /// <param name="webClientName">Tên của client</param>
        /// <param name="hubConnectionID">ID của connection</param>
        public void WebNotify(string webClientName)
        {
            string a = Context.ConnectionId;
            //_ClientList = _ClientList ?? new ClientList();
            _ClientList.Add(new Client
            {
                ClientName = webClientName,
                ConnectionID = Context.ConnectionId,
                LastConnected = DateTime.Now
            });

           
        }

        /// <summary>
        /// Hàm để win client gọi trước khi ngưng kết nối
        /// </summary>
        /// <param name="winClientName">Tên client</param>
        /// <param name="hubConnectionID">ID của connection</param>
        public void WinStop(string winClientName, string hubConnectionID)
        {
            _ClientList.Remove(winClientName);
        }

        /// <summary>
        /// Hàm để web client gọi trước khi ngưng kết nối
        /// </summary>
        /// <param name="webClientName">Tên client</param>
        /// <param name="hubConnectionID">ID của connection</param>
        public void WebStop(string webClientName, string hubConnectionID)
        {
            _ClientList.Remove(webClientName);
        }

    }

    /// <summary>
    /// Lớp quản lý danh sách các client kết nối vào server,
    /// bao gồm window client và web client
    /// </summary>
    public class ClientList
    {
        /// <summary>
        ///  Khởi tạo một đối tượng ClientList
        /// </summary>
        public ClientList()
        {
            Clients = new List<Client>();
        }

        /// <summary>
        /// Danh sách các client
        /// </summary>
        public List<Client> Clients
        {
            get;
            set;
        }

        /// <summary>
        /// Thêm một client vào danh sách
        /// </summary>
        /// <param name="client"></param>
        public void Add(Client newClient)
        {
            //if (Clients.Find(c => c.ConnectionID.Equals(client.ConnectionID)) != null)
            //{
            //    Clients.Add(client);
            //}

            // Nếu client không có trong danh sách, thì thêm vào
            // Nếu đã có, thì cập nhật connection id
            // LƯU Ý: ConnectionID sẽ thay đổi khi trang web client refresh,
            //  hoặc khi win client bị tắt và khởi động lại
            Client existedClient = Clients.Find(c => c.ClientName.Equals(newClient.ClientName));
            if (existedClient == null)
            {
                Clients.Add(newClient);
            }
            else                
            {
                existedClient.ConnectionID = newClient.ConnectionID;
            }
        }

        /// <summary>
        /// Xóa một client khỏi danh sách
        /// </summary>
        /// <param name="client"></param>
        public void Remove(string clientName)
        {
            Clients.Remove(Clients.Find(c=>c.ClientName.Equals(clientName)));
        }

        /// <summary>
        /// Tìm một client theo tên
        /// </summary>
        /// <param name="clientName"></param>
        /// <returns></returns>
        public Client FindByName(string clientName)
        {
            return Clients.Find(c => c.ClientName.Equals(clientName));
        }
    }

    /// <summary>
    /// Đối tượng client
    /// </summary>
    public class Client
    {
        /// <summary>
        /// ID của connection hiện tại
        /// </summary>
        public string ConnectionID
        {
            get;
            set;
        }

        /// <summary>
        /// Tên của client, có thể là một GUID, hoặc IP, hoặc username
        /// </summary>
        public string ClientName
        {
            get;
            set;
        }

        /// <summary>
        /// Thời gian kết nối cuối cùng
        /// </summary>
        public DateTime LastConnected
        {
            get;
            set;
        }

        /// <summary>
        /// Ghi log
        /// </summary>
        public void Log()
        {

        }

        public override string ToString()
        {
            return string.Format("{0} | {1} | {2}",ClientName, ConnectionID, LastConnected);
        }

    }
}